package com.jiunuan.live.living.provider.service.impl;

import com.jiunuan.live.common.interfaces.enums.CommonstatusEnum;
import com.jiunuan.live.common.interfaces.utils.ConvertBeanUtils;
import com.jiunuan.live.framework.redis.starter.key.LivingProviderCacheKeyBuilder;
import com.jiunuan.live.living.interfaces.dto.LivingRoomReqDTO;
import com.jiunuan.live.living.provider.dao.mapper.ILivingRoomMapper;
import com.jiunuan.live.living.provider.dao.mapper.ILivingRoomRecordMapper;
import com.jiunuan.live.living.provider.dao.po.LivingRoomPO;
import com.jiunuan.live.living.provider.dao.po.LivingRoomRecordPO;
import com.jiunuan.live.living.provider.service.ILivingRoomTxService;
import jakarta.annotation.Resource;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;

/**
 * @Author: JiuNuan
 * @CreateTime: 2024-08-19 17:17
 * @Description:
 */

@Service
public class LivingRoomTxServiceImpl implements ILivingRoomTxService {
    @Resource
    private ILivingRoomMapper livingRoomMapper;
    @Resource
    private ILivingRoomRecordMapper livingRoomRecordMapper;
    @Resource
    private RedisTemplate<String, Object> redisTemplate;
    @Resource
    private LivingProviderCacheKeyBuilder cacheKeyBuilder;

    /**
     * 关闭直播间
     * 该方法旨在关闭一个正在直播的直播间，它通过将直播间的信息转移到记录表中并删除当前的直播间记录来实现关闭操作
     * 只有直播间的主播可以执行此操作，且直播间必须正在直播中
     *
     * @param livingRoomReqDTO 包含直播间信息的请求数据传输对象，包括主播ID和直播间ID
     * @return 如果关闭操作成功，返回true；如果找不到直播间或主播ID不匹配，返回false
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean closeLiving(LivingRoomReqDTO livingRoomReqDTO) {
        // 根据提供的房间ID查询直播间信息
        LivingRoomPO livingRoomPO = livingRoomMapper.selectById(livingRoomReqDTO.getRoomId());
        // 如果找不到直播间，直接返回false
        if(livingRoomPO == null){
            return false;
        }
        // 检查操作者是否为该直播间的主播，如果不是，则返回false
        if(!(livingRoomPO.getAnchorId().equals(livingRoomReqDTO.getAnchorId()))){
            return false;
        }
        // 将直播间的PO对象转换为记录PO对象，以便记录本次直播的结束
        LivingRoomRecordPO livingRoomRecordPO = ConvertBeanUtils.convert(livingRoomPO, LivingRoomRecordPO.class);
        // 设置直播结束时间为当前时间
        livingRoomRecordPO.setEndTime(new Date());
        // 设置直播记录状态为无效，表示直播已结束
        livingRoomRecordPO.setStatus(CommonstatusEnum.INVALID_STATUS.getCode());
        // 将直播记录保存到数据库
        livingRoomRecordMapper.insert(livingRoomRecordPO);
        // 删除当前的直播间记录，物理上结束这个直播
        livingRoomMapper.deleteById(livingRoomPO.getId());
        // 移除直播间缓存
        String cacheKey = cacheKeyBuilder.buildLivingRoomObj(livingRoomReqDTO.getRoomId());
        redisTemplate.delete(cacheKey);
        // 操作成功，返回true
        return true;
    }

}
